package com.mybatisflex.admin.controller;

import com.mybatisflex.admin.entity.Account;
import com.mybatisflex.admin.interceptor.LoginInterceptor;
import com.mybatisflex.admin.service.AccountService;
import com.mybatisflex.admin.spring.jsonbody.JsonBody;
import com.mybatisflex.admin.util.JwtUtil;
import com.mybatisflex.admin.util.Result;
import com.mybatisflex.core.paginate.Page;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.io.Serializable;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 *  控制层。
 *
 * @author michael
 * @since 2023-07-01
 */
@RestController
@RequestMapping("/api/account")
public class AccountController {

    @Autowired
    private AccountService accountService;

    /**
     * 登录
     *
     * @param username  账号
     * @param password 密码
     */
    @PostMapping("/login")
    public Result login(@JsonBody("username") String username, @JsonBody("password") String password) {
        Result result = accountService.login(username, password);
        if (result.isSuccess()) {
            Map<String, Object> map = new HashMap<>();
            map.put(LoginInterceptor.loginSessionId, result.get(LoginInterceptor.loginSessionId));
            String token = JwtUtil.createToken(map);
            result.set("jwt", token);
        }
        return result;
    }


    /**
     * 个人资料详情
     */
    @GetMapping("/detail")
    public Result detail(){
        Account account = accountService.getById(LoginInterceptor.getLoginAccountId());
        account.setPassword(null);
        account.setSalt(null);
        return Result.success("account",account);
    }

    /**
     * 添加。
     *
     * @param account 
     * @return {@code true} 添加成功，{@code false} 添加失败
     */
    @PostMapping("save")
    public boolean save(@RequestBody Account account) {
        return accountService.save(account);
    }

    /**
     * 根据主键删除。
     *
     * @param id 主键
     * @return {@code true} 删除成功，{@code false} 删除失败
     */
    @DeleteMapping("remove/{id}")
    public boolean remove(@PathVariable Serializable id) {
        return accountService.removeById(id);
    }

    /**
     * 根据主键更新。
     *
     * @param account 
     * @return {@code true} 更新成功，{@code false} 更新失败
     */
    @PutMapping("update")
    public boolean update(@RequestBody Account account) {
        return accountService.updateById(account);
    }

    /**
     * 查询所有。
     *
     * @return 所有数据
     */
    @GetMapping("list")
    public List<Account> list() {
        return accountService.list();
    }

    /**
     * 根据主键获取详细信息。
     *
     * @param id 主键
     * @return 详情
     */
    @GetMapping("getInfo/{id}")
    public Account getInfo(@PathVariable Serializable id) {
        return accountService.getById(id);
    }

    /**
     * 分页查询。
     *
     * @param page 分页对象
     * @return 分页对象
     */
    @GetMapping("page")
    public Page<Account> page(Page<Account> page) {
        return accountService.page(page);
    }

}